#ifndef PRIMITIVA_H
#define PRIMITIVA_H
#define TIPO_ELEMENTO double

#include <algorithm>//Para usar "fill", "swap" e "copy".
#include <cstddef>  //Para usar "size_t".
#include <cstring>  //Para usar "strlen" e "strtok".
#include <cstdlib>  //Para usar "atof"
#include <utility>  //Para usar "pair".
#include <iostream>
#include <QString>
using namespace std;

class Primitiva
{
    private:
        pair<TIPO_ELEMENTO*,size_t> string_para_vetor(const char* entrada);

    protected:
        /// Atributos: ///
        TIPO_ELEMENTO *coordenadas;
        size_t dimensao;

        /// Métodos privados: ///
        // Setar "dimensão" para zero e "coordenadas" para NULL:
        void inicializador();                                          ///ok!

        // Setar a dimensão da primitiva:
        void set_dimensao(size_t d);                                   ///ok!

    public:
        /// Métodos públicos: ///
        // Construtores e destrutor:
        Primitiva();                                                   ///ok!
        Primitiva(size_t d);                                           ///ok!
        // Construtor-cópia:
        Primitiva(const Primitiva& p);                                 ///ok!
        // Construtor que recebe uma c-string com coordenadas:
        Primitiva(const char* entrada);                                ///ok!
        virtual ~Primitiva();                                          ///ok!

        // Nome e abreviatura da classe:
        virtual const char* get_nome() const/// = 0;                   ///ok!
        { return("Primitiva."); }
        virtual const char* get_abreviatura() const/// = 0;            ///ok!
        { return("pri"); }

        // Retorna a dimensão da primitiva:
        size_t get_dimensao() const;                                   ///ok!

        // Exibe informações técnicas da classe:
        void info() const;                                             ///ok!

        // Imprime as coordenadas da primitiva:
        void imprimir() const;                                         ///ok!

        // Troca os valores dos atributos de duas primitivas:
        friend void trocar_atributos(Primitiva& pri, Primitiva& seg);  ///ok!

        // Operador de atribuição da classe:
        //Primitiva& operator=(Primitiva p);
        Primitiva& operator=(Primitiva p);                             ///ok!

        // Seta a coordenada de uma dada posição:
        TIPO_ELEMENTO& operator()(size_t posicao);                     ///ok!

        // Retorna a coordenada de uma dada posição:
        const TIPO_ELEMENTO& operator()(size_t posicao) const;         ///ok!

        // Seta todas as coordenadas para um dado valor "x":
        void operator[](TIPO_ELEMENTO x);                              ///ok!
};

#endif // PRIMITIVA_H
